package com.note.feng.leetcode.algorithms.easy.five;

public class FiveHundredFortyOne {

    /**
     * 541 反转字符串 II
     * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
     *
     * 如果剩余字符少于 k 个，则将剩余字符全部反转。
     * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
     *
     * 示例 1：
     *
     * 输入：s = "abcdefg", k = 2
     * 输出："bacdfeg"
     * 示例 2：
     *
     * 输入：s = "abcd", k = 2
     * 输出："bacd"
     *
     * 提示：
     *
     * 1 <= s.length <= 104
     * s 仅由小写英文组成
     * 1 <= k <= 104
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/reverse-string-ii
     */
    /**
     * 解法：遍历字符串，分段反转
     * @param s
     * @param k
     * @return
     */
    public String reverseStr(String s, int k) {
        int n = s.length();
        char [] chars = s.toCharArray();
        for (int i = 0; i < n; i += 2 * k) {
            resverse(chars, i, Math.min(i + k, n) - 1);
        }
        return new String(chars);
    }

    private void resverse(char [] arr, int left, int right){
        while (left < right){
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left ++;
            right --;
        }
    }
}
